package com.elitedatai.mchtest.flyer.service;

import com.elitedatai.mchtest.flyer.model.dto.FlyerDTO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

/**
 * 飞手服务接口
 * 定义了飞手管理相关的业务方法
 */
public interface IFlyerService {

    /**
     * 创建飞手
     * @param flyerDTO 飞手数据传输对象
     * @return 创建成功的飞手DTO
     */
    FlyerDTO createFlyer(FlyerDTO flyerDTO);

    /**
     * 根据ID更新飞手信息
     * @param id 飞手主键ID
     * @param flyerDTO 更新的飞手信息
     * @return 更新后的飞手DTO
     */
    Optional<FlyerDTO> updateFlyerById(Long id, FlyerDTO flyerDTO);

    /**
     * 根据飞手ID更新飞手信息
     * @param flyerId 飞手ID
     * @param flyerDTO 更新的飞手信息
     * @return 更新后的飞手DTO
     */
    Optional<FlyerDTO> updateFlyerByFlyerId(String flyerId, FlyerDTO flyerDTO);

    /**
     * 根据ID删除飞手
     * @param id 飞手主键ID
     * @return 删除是否成功
     */
    boolean deleteFlyerById(Long id);

    /**
     * 根据飞手ID删除飞手
     * @param flyerId 飞手ID
     * @return 删除是否成功
     */
    boolean deleteFlyerByFlyerId(String flyerId);

    /**
     * 根据ID查询飞手信息
     * @param id 飞手主键ID
     * @return 飞手DTO
     */
    Optional<FlyerDTO> getFlyerById(Long id);

    /**
     * 根据飞手ID查询飞手信息
     * @param flyerId 飞手ID
     * @return 飞手DTO
     */
    Optional<FlyerDTO> getFlyerByFlyerId(String flyerId);

    /**
     * 根据姓名查询飞手信息
     * @param flyerName 飞手姓名
     * @return 飞手DTO列表
     */
    List<FlyerDTO> getFlyersByName(String flyerName);

    /**
     * 根据状态查询飞手信息
     * @param status 飞手状态
     * @return 飞手DTO列表
     */
    List<FlyerDTO> getFlyersByStatus(Integer status);

    /**
     * 根据资质类型查询飞手信息
     * @param qualificationType 资质类型
     * @return 飞手DTO列表
     */
    List<FlyerDTO> getFlyersByQualificationType(String qualificationType);

    /**
     * 根据认证等级查询飞手信息
     * @param certificationLevel 认证等级
     * @return 飞手DTO列表
     */
    List<FlyerDTO> getFlyersByCertificationLevel(String certificationLevel);

    /**
     * 查询所有飞手信息
     * @return 飞手DTO列表
     */
    List<FlyerDTO> getAllFlyers();

    /**
     * 分页查询所有飞手
     * @param pageable 分页参数
     * @return 飞手DTO分页数据
     */
    Page<FlyerDTO> getAllFlyers(Pageable pageable);

    /**
     * 根据状态分页查询飞手
     * @param status 飞手状态
     * @param pageable 分页参数
     * @return 飞手DTO分页数据
     */
    Page<FlyerDTO> getFlyersByStatus(Integer status, Pageable pageable);

    /**
     * 多条件动态查询飞手信息
     * @param flyerId 飞手ID
     * @param flyerName 飞手姓名
     * @param status 飞手状态
     * @param qualificationType 资质类型
     * @param certificationLevel 认证等级
     * @return 飞手DTO列表
     */
    List<FlyerDTO> getFlyersByMultipleConditions(String flyerId, String flyerName, Integer status, 
                                                String qualificationType, String certificationLevel);

    /**
     * 检查飞手ID是否存在
     * @param flyerId 飞手ID
     * @return 是否存在
     */
    boolean existsByFlyerId(String flyerId);

    /**
     * 检查电话是否存在
     * @param phone 电话号码
     * @return 是否存在
     */
    boolean existsByPhone(String phone);

    /**
     * 检查邮箱是否存在
     * @param email 邮箱地址
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 更新飞手状态
     * @param flyerId 飞手ID
     * @param status 新状态
     * @return 更新是否成功
     */
    boolean updateFlyerStatus(String flyerId, Integer status);

    /**
     * 增加飞行时长
     * @param flyerId 飞手ID
     * @param additionalHours 增加的飞行时长
     * @return 更新是否成功
     */
    boolean addFlightHours(String flyerId, BigDecimal additionalHours);

    /**
     * 增加任务次数
     * @param flyerId 飞手ID
     * @param additionalMissions 增加的任务次数
     * @return 更新是否成功
     */
    boolean addMissions(String flyerId, Integer additionalMissions);

    /**
     * 增加事故次数
     * @param flyerId 飞手ID
     * @param additionalAccidents 增加的事故次数
     * @return 更新是否成功
     */
    boolean addAccidents(String flyerId, Integer additionalAccidents);

    /**
     * 增加违规次数
     * @param flyerId 飞手ID
     * @param additionalViolations 增加的违规次数
     * @return 更新是否成功
     */
    boolean addViolations(String flyerId, Integer additionalViolations);

    /**
     * 计算并更新安全评级
     * @param flyerId 飞手ID
     * @return 更新是否成功
     */
    boolean calculateAndUpdateSafetyRating(String flyerId);

    /**
     * 批量更新飞手状态
     * @param flyerIds 飞手ID列表
     * @param status 新状态
     * @return 更新的记录数
     */
    int batchUpdateFlyerStatus(List<String> flyerIds, Integer status);
}